Перейти к основному содержимому

2.01. Основы UNIX

Разработчику Архитектору Инженеру

Основы UNIX

UNIX — это операционная система, оказавшая глубокое влияние на развитие современных вычислительных платформ. Её концепции, архитектурные решения и философия проектирования легли в основу множества современных систем, включая Linux и macOS. UNIX зарекомендовала себя как надёжная, гибкая и мощная среда, особенно подходящая для задач, требующих стабильности, масштабируемости и контроля со стороны пользователя или администратора.


Архитектура UNIX

Архитектура UNIX строится вокруг нескольких ключевых компонентов: ядра, оболочки, файловой системы и набора утилит. Эти компоненты взаимодействуют между собой, образуя целостную экосистему, где каждый элемент выполняет свою роль.

Ядро (Kernel) — центральная часть операционной системы. Оно управляет ресурсами компьютера: процессорным временем, памятью, устройствами ввода-вывода. Ядро отвечает за планирование выполнения процессов, распределение памяти, обработку прерываний, работу с драйверами устройств, буферизацию данных на диске и обеспечение механизмов межпроцессного взаимодействия (IPC). В зависимости от реализации ядро может быть монолитным или модульным, что позволяет загружать и выгружать компоненты по мере необходимости.

Все пользовательские программы работают в так называемом пользовательском режиме, изолированном от ядра. Доступ к функциям ядра возможен только через системные вызовы — стандартизированный интерфейс, позволяющий программе запросить у ядра выполнение определённой операции: открытие файла, создание процесса, чтение с устройства и так далее. При выполнении системного вызова процесс временно переходит в режим ядра, получая доступ к привилегированным инструкциям и ресурсам. После завершения вызова управление возвращается в пользовательский режим.

Оболочка (Shell) — это интерпретатор команд, предоставляющий пользователю интерфейс для взаимодействия с системой. Оболочка принимает текстовые команды, анализирует их, запускает соответствующие программы и управляет потоками ввода-вывода. Наиболее распространённой оболочкой является Bash (Bourne Again Shell), но существуют и другие: Zsh, Ksh, Csh и другие. Оболочка не является частью ядра; она работает как обычный пользовательский процесс, но играет роль посредника между человеком и операционной системой.

Файловая система в UNIX имеет иерархическую структуру, начинающуюся с корневого каталога /. Все данные, включая устройства, процессы и даже сетевые ресурсы, представлены в виде файлов или каталогов. Такой подход обеспечивает единообразие и упрощает взаимодействие с различными типами объектов. Каждый файл характеризуется метаданными: владельцем, правами доступа, временем изменения, размером и типом.

Утилиты — это небольшие программы, каждая из которых решает одну конкретную задачу. Принцип UNIX гласит: «делай одну вещь и делай её хорошо». Благодаря этому утилиты легко комбинируются между собой, образуя сложные последовательности обработки данных. Например, вывод одной команды может стать входом для другой с помощью механизма конвейера (pipe).


Философия и ключевые особенности

UNIX построена на нескольких фундаментальных принципах:

  • Многозадачность: система способна одновременно выполнять множество процессов, переключаясь между ними с высокой скоростью.
  • Многопользовательность: несколько пользователей могут работать на одном компьютере независимо друг от друга, с собственными домашними каталогами, настройками и правами доступа.
  • Конфигурация через текстовые файлы: параметры системы, приложений и пользовательских окружений хранятся в читаемых текстовых файлах, что упрощает автоматизацию, резервное копирование и восстановление.
  • Переносимость: код ядра и приложений написан на языке C, что позволяет легко адаптировать систему под различные аппаратные платформы.
  • Составляемость: простые утилиты объединяются в цепочки для решения сложных задач без необходимости создания новых программ.

Эти принципы обеспечивают гибкость, надёжность и долговечность UNIX-систем. Они остаются актуальными спустя десятилетия после появления первых версий.


Пользователи и группы

UNIX — многопользовательская система. Каждый пользователь имеет уникальный идентификатор пользователя (UID) и принадлежит хотя бы к одной группе, имеющей свой идентификатор группы (GID). Информация о пользователях и группах хранится в текстовых файлах:

  • /etc/passwd — содержит базовые данные о каждом пользователе: имя, UID, GID, домашний каталог, оболочку.
  • /etc/group — описывает группы и их участников.
  • /etc/shadow — хранит зашифрованные пароли и политики их смены; доступен только суперпользователю.

Особое положение занимает пользователь root (UID = 0). Он обладает полными правами на систему: может изменять любые файлы, запускать любые процессы, конфигурировать оборудование. Использование root-доступа требует осторожности, так как ошибки могут привести к повреждению системы.

Для временного перехода под другого пользователя используется команда su. Например, su - username запускает новую оболочку с окружением указанного пользователя. Команда passwd позволяет изменить пароль, а logins — просмотреть информацию о всех учётных записях.


Файловая система и типы файлов

В UNIX всё является файлом. Это не метафора, а архитектурное решение. Существует несколько типов файлов:

  • Обычные файлы — содержат данные: текст, двоичный код, изображения. Для системы это просто последовательность байтов.
  • Каталоги — специальные файлы, хранящие имена других файлов и ссылки на их метаданные. Создаются командой mkdir.
  • Специальные файлы устройств — представляют физические или виртуальные устройства. Различают блочные (b) и символьные (c) устройства. Блочные работают с данными порциями фиксированного размера (например, жёсткие диски), символьные — побайтово (например, терминалы).
  • Именованные каналы (FIFO) — позволяют передавать данные между процессами в порядке очереди. Создаются с помощью mknod имя p.
  • Символические ссылки — файлы, содержащие путь к другому файлу. Они могут указывать на несуществующие объекты и пересекать границы файловых систем. Создаются командой ln -s цель ссылка.
  • Жёсткие ссылки — дополнительные имена одного и того же файла в пределах одной файловой системы. Увеличивают счётчик ссылок в индексном дескрипторе. Удаление одной жёсткой ссылки не удаляет данные, пока существует хотя бы одна другая.
  • Сокеты — используются для межпроцессного или сетевого взаимодействия. Представлены как файлы в файловой системе, но служат точками соединения.

Команда ls -l показывает тип файла первым символом в строке: - — обычный файл, d — каталог, l — символическая ссылка, c/b — устройства, p — FIFO, s — сокет.

Для определения типа файла более точно применяется команда file, которая анализирует содержимое и пытается классифицировать его: текст, исполняемый файл, архив и так далее.


Работа с командной строкой

Командная строка — основной инструмент взаимодействия с UNIX. Каждая команда — это программа, запускаемая оболочкой. Многие команды являются встроенными в оболочку (например, cd, export), другие — внешними утилитами (ls, grep, awk).

Основные команды

  • ls — список файлов и каталогов.
  • cd — смена текущего каталога.
  • pwd — вывод полного пути текущего каталога.
  • cp — копирование файлов.
  • mv — перемещение или переименование.
  • rm — удаление файлов.
  • mkdir, rmdir — создание и удаление каталогов.
  • cat — вывод содержимого файла.
  • head, tail — показ начала или конца файла.
  • grep — поиск строк по шаблону.
  • sort — сортировка строк.
  • wc — подсчёт строк, слов, байтов.
  • find — рекурсивный поиск файлов по различным критериям.
  • chmod — изменение прав доступа.
  • echo — вывод текста.
  • man — справка по командам и системным вызовам.

Перенаправление и конвейеры

UNIX использует мощные механизмы управления потоками:

  • > — перенаправление вывода в файл (перезапись).
  • >> — добавление вывода в конец файла.
  • < — перенаправление ввода из файла.
  • | — передача вывода одной команды на вход другой (конвейер).

Пример:

grep "error" /var/log/syslog | tail -n 20 | wc -l

Эта команда находит строки с «error» в логе, берёт последние 20 из них и считает их количество.

Специальные символы

  • $ — начало приглашения оболочки (обычно для обычного пользователя; у root — #).
  • # — начало комментария в скриптах или приглашение root.
  • & — запуск команды в фоновом режиме.
  • ; — разделение нескольких команд в одной строке.
  • &&, || — условное выполнение (только при успехе или неудаче предыдущей команды).

Скрипты и автоматизация

Оболочка поддерживает написание сценариев (shell-скриптов) — последовательностей команд, сохранённых в файле. Скрипты могут содержать переменные, условия, циклы и функции.

Переменные задаются без пробелов вокруг =:

NAME="Alice"
echo $NAME

Условные конструкции:

if [ -f /tmp/file ]; then
echo "Файл существует"
else
echo "Файла нет"
fi

Циклы:

for i in 1 2 3; do
echo "Итерация $i"
done

Автоматизация задач достигается с помощью cron — демона, запускающего команды по расписанию. Пользователь редактирует своё расписание командой crontab -e.


Процессы и сигналы

Каждая запущенная программа становится процессом, имеющим уникальный PID (Process ID). Процессы могут быть запущены в фоне (&), переведены на передний план (fg) или отправлены в фон (bg). Команда ps показывает список процессов, kill — отправляет сигнал процессу.

Сигналы — это способ взаимодействия с процессами. Наиболее известные:

  • SIGTERM (15) — запрос на корректное завершение. Процесс может обработать его и завершиться аккуратно.
  • SIGKILL (9) — немедленное завершение без возможности обработки.
  • SIGHUP — часто используется для перезагрузки конфигурации демонов.

Команда kill -15 PID отправляет SIGTERM, давая процессу шанс завершиться правильно.


Код возврата

Каждая команда завершается с кодом возврата (exit code). Нулевой код означает успешное выполнение, ненулевой — ошибку. Этот код доступен через переменную $? и используется в условиях и скриптах для принятия решений.

Пример:

ls /nonexistent
echo $? # выведет 2 (ошибка)

Наследие UNIX

UNIX породила множество потомков. Linux — свободная реализация, ставшая основой большинства серверов, облачных систем и Android. macOS — сертифицированная UNIX-система, сочетающая графический интерфейс с мощной командной строкой. BSD (FreeBSD, OpenBSD, NetBSD) — прямые наследники оригинального кода AT&T, отличающиеся стабильностью и чистотой архитектуры.

Несмотря на разнообразие, все эти системы сохраняют общие черты: иерархическую файловую систему, оболочку, утилиты, права доступа, процессы и сигналы. Знание основ UNIX открывает доступ к пониманию работы современных операционных систем на глубоком уровне.


Права доступа и управление ресурсами

В UNIX каждый файл и каталог имеет набор атрибутов, определяющих, кто и как может с ним взаимодействовать. Эти атрибуты называются правами доступа (permissions). Они делятся на три категории:

  • Владелец (user) — пользователь, создавший файл или получивший право собственности.
  • Группа (group) — группа, к которой принадлежит файл.
  • Остальные (others) — все остальные пользователи системы.

Для каждой категории определены три базовых права:

  • r (read) — разрешение на чтение содержимого файла или списка файлов в каталоге.
  • w (write) — разрешение на изменение содержимого файла или добавление/удаление файлов в каталоге.
  • x (execute) — для файлов это право на запуск как программы; для каталогов — право на вход (cd) и доступ к содержимому.

Права отображаются в длинном формате команды ls -l в виде строки вида -rwxr-xr--. Первый символ указывает тип файла (например, - — обычный файл, d — каталог), следующие девять — права для владельца, группы и остальных по три символа.

Изменение прав выполняется командой chmod. Она поддерживает два режима записи:

  • Символьный:

    chmod u+x script.sh    # добавить владельцу право на выполнение
    chmod go-w file.txt # убрать у группы и остальных право на запись
  • Числовой (восьмеричный):
    Каждое право кодируется битами: r=4, w=2, x=1. Сумма даёт число от 0 до 7.

    chmod 755 script.sh    # rwx для владельца, r-x для группы и остальных
    chmod 644 document.txt # rw- для владельца, r-- для остальных

Владелец файла может быть изменён только суперпользователем с помощью команды chown:

chown alice:developers project/

Эта команда делает пользователя alice владельцем, а группу developers — группой-владельцем каталога project.

Для каталогов право на выполнение (x) особенно важно: без него невозможно получить доступ к файлам внутри, даже если есть права на чтение самого каталога.


Специальные права: sticky bit, setuid, setgid

UNIX поддерживает расширенные атрибуты, влияющие на поведение файлов и каталогов:

  • Sticky bit (t в конце прав, например drwxrwxrwt) — применяется к каталогам. Он гарантирует, что только владелец файла или root может удалить файл из этого каталога, даже если у других есть право на запись. Обычно используется в /tmp.

    chmod +t /shared
  • Setuid (s в позиции владельца, например -rwsr-xr-x) — при запуске исполняемого файла процесс получает права владельца файла, а не запустившего пользователя. Это позволяет обычным пользователям временно выполнять привилегированные операции (например, passwd).

    chmod u+s /usr/bin/mytool
  • Setgid (s в позиции группы) — аналогично, но процесс наследует группу владельца. Если применено к каталогу, все новые файлы внутри наследуют группу каталога, а не основную группу пользователя.

    chmod g+s /project/shared

Эти механизмы требуют осторожного использования, так как могут создавать уязвимости при неправильной настройке.


Управление пользователями и группами

Администрирование пользователей в UNIX осуществляется через текстовые файлы и специализированные утилиты.

Помимо просмотра файлов /etc/passwd, /etc/group и /etc/shadow, администратор использует команды:

  • useradd — создание нового пользователя.
  • userdel — удаление пользователя.
  • groupadd, groupdel — управление группами.
  • passwd — смена пароля.
  • id — отображение UID, GID и групп текущего пользователя.

Пример создания пользователя:

useradd -m -s /bin/bash developer
passwd developer

Флаг -m создаёт домашний каталог, -s задаёт оболочку.

Группы позволяют упростить управление доступом. Пользователь может быть добавлен в дополнительные группы:

usermod -aG docker alice

Теперь alice может работать с Docker без sudo, если демон настроен на группу docker.


Файловая система: устройство и монтирование

Физически данные хранятся на разделах дисков. Каждый раздел форматируется в определённую файловую систему (ext4, XFS, ZFS и другие). Логическая файловая система UNIX объединяет все такие разделы в единое дерево, начиная с /.

Процесс подключения раздела к дереву называется монтированием. Например:

mount /dev/sdb1 /mnt/data

Теперь содержимое диска /dev/sdb1 доступно через /mnt/data.

Информация о смонтированных файловых системах хранится в /etc/fstab — файле, используемом при загрузке системы для автоматического монтирования. Пример записи:

/dev/sda2  /home  ext4  defaults  0 2

Команда df -h показывает использование дискового пространства, du -sh * — размер файлов и каталогов в текущей директории.


Механизмы поиска и фильтрации

UNIX предоставляет мощные инструменты для поиска и обработки данных.

grep — поиск строк по шаблону (регулярному выражению):

grep "ERROR" logfile.txt
grep -r "TODO" ~/project/ # рекурсивный поиск

find — поиск файлов по имени, типу, времени изменения, размеру:

find /var/log -name "*.log" -mtime -7   # логи за последнюю неделю
find . -type f -size +100M # файлы больше 100 МБ

awk — язык для обработки текстовых данных по колонкам:

awk '{print $1}' /etc/passwd   # вывести первый столбец
awk -F: '$3 > 1000 {print $1}' /etc/passwd # пользователи с UID > 1000

sed — потоковый редактор для замены, удаления, вставки текста:

sed 's/foo/bar/g' file.txt     # заменить все "foo" на "bar"
sed -i 's/old/new/g' file.txt # изменить файл на месте

Эти утилиты часто комбинируются:

ps aux | grep nginx | awk '{print $2}' | xargs kill

Эта цепочка находит PID процессов nginx и завершает их.


Планировщик задач: cron

Автоматизация повторяющихся задач достигается через cron — системный демон, запускающий команды по расписанию.

Каждый пользователь имеет своё расписание, редактируемое командой:

crontab -e

Формат строки:

минута час день_месяца месяц день_недели команда

Примеры:

0 2 * * * /backup.sh          # ежедневно в 2:00
*/10 * * * * /check_status.sh # каждые 10 минут

Результаты выполнения (вывод, ошибки) обычно отправляются на email пользователя или записываются в лог.


Работа с различиями: diff и patch

Команда diff сравнивает два файла и выводит различия:

diff old.conf new.conf

Формат вывода можно использовать для создания патча — файла с инструкциями по преобразованию одного файла в другой:

diff -u old.conf new.conf > fix.patch
patch old.conf < fix.patch

Этот механизм широко применяется в разработке программного обеспечения для распространения изменений.


Контроль целостности: sha1sum и аналоги

Для проверки целостности файлов используются хеш-функции. Команда sha1sum вычисляет контрольную сумму:

sha1sum document.pdf

Результат можно сохранить и позже проверить:

sha1sum -c checksums.sha1

Современные системы предпочитают более надёжные алгоритмы: sha256sum, sha512sum.